#include <iostream>
using namespace std;

#include <signal.h>
#include <unistd.h>

// int main()
// {
//     while(true) //死循环用信号终止 - CTRL+C的2号信号终止前台 / kill 9信号终止前后台
//     {
//         cout<<getpid()<<"当前进程运行中..."<<endl; //18继续进程/19暂停进程 - 但进程被再次唤醒时变成了后台进程
//         sleep(1);
//     }
//     return 0;
// }


//设置信号的捕获函数
// void fun(int signo) //typedef void (*sighandler_t)(int) 自定义捕获函数的规格
// {
//     cout<<"触发"<<signo<<"信号"<<" 执行fun函数"<<endl;
//     exit(0);
// }

// int main()
// {
//     signal(2,fun); //将2号信号CTRL+C的处理函数自定义为fun
//     signal(3,fun); //将3号信号CTRL+\的处理函数自定义为fun
//     signal(9,fun); //将9号信号的处理函数自定义为fun 但9号信号无法被自定义函数
//     //当2/3号信号产生的时候会自动调用fun方法
//     //signal执行的是用户动作的自定义捕捉
//     while(true) //死循环用信号终止 - CTRL+C的2号信号终止前台 / kill 9信号终止前后台
//     {
//         cout<<getpid()<<"当前进程运行中..."<<endl;
//         sleep(1);
//     }
//     return 0;
// }


//raise向自己发送信号
// int main()
// {
//     signal(2,fun);
//     while(true) //死循环用信号终止 - CTRL+C的2号信号终止前台 / kill 9信号终止前后台
//     {
//         raise(2); //调用raise向自己不断发送2号信号
//         cout<<getpid()<<"当前进程运行中..."<<endl; //18继续进程/19暂停进程 - 但进程被再次唤醒时变成了后台进程
//         sleep(1);
//     }
//     return 0;
// }

//abort() C接口发送6号信号
// int main()
// {
//     signal(SIGABRT,fun);
//     while(true) //死循环用信号终止 - CTRL+C的2号信号终止前台 / kill 9信号终止前后台
//     {
//         sleep(1);
//         abort(); //C语言对信号的封装 发送6号信号 但用户自定义处理后仍然会时代六号信号
//         cout<<getpid()<<"当前进程运行中..."<<endl; //18继续进程/19暂停进程 - 但进程被再次唤醒时变成了后台进程
//         sleep(1);
//     }
//     return 0;
// }

//int count = 0;
//测试IO性能怠速
// void fun(int signo) //typedef void (*sighandler_t)(int) 自定义捕获函数的规格
// {
//     cout<<count<<endl;
//     exit(0);
// }

// void fun(int signo) //typedef void (*sighandler_t)(int) 自定义捕获函数的规格
// {
//     cout<<"signal:"<<signo<<endl;
//     alarm(1); //每隔一秒设置一次
// }

void fun(int signo) 
{
    cout<<"signal:"<<signo<<endl;
    int n = alarm(10);  //返回上一个闹钟被提前唤醒时 距离被闹钟真正响还有多长时间(提前响了几秒)
    cout<<"alarm return:"<<n<<"  闹钟被程序设置为10S!"<<endl;
    //如果闹钟全部跑完按时响起则返回值为0
}

//软件条件产生信号 - 闹钟 alarm 在指定时间到了之后发送14号信号 时间不一定非常精确
int main()
{
    // signal(SIGALRM,fun);
    // alarm(5); //这个闹钟是一次性的 5 秒之后发送信号就没了
    // while(true) //死循环用信号终止 - CTRL+C的2号信号终止前台 / kill 9信号终止前后台
    // {
    //     cout<<getpid()<<"当前进程运行中..."<<endl; //18继续进程/19暂停进程 - 但进程被再次唤醒时变成了后台进程
    //     sleep(1);
    // }

    //alarm(1);
    //无IO一秒的累计
    // while(true)
    // {
    //     //++count;
    //     count++; //前后置++的区别
    // }
    //有IO一秒的累计
    // while(true) //解决10^4差距
    // {
    //     cout<<"count:"<<++count<<endl;
    //     cout<<"count:"<<count++<<endl;
    // }

    // signal(SIGALRM,fun); //重复设置闹钟 1 秒一次
    // alarm(1);
    // while(true) 
    // {
    //     cout<<getpid()<<"当前进程运行中..."<<endl; //18继续进程/19暂停进程 - 但进程被再次唤醒时变成了后台进程
    //     sleep(1);
    // }

    signal(SIGALRM,fun); //重复设置闹钟 10 秒一次  然后发送信号使闹钟提前响起然后被重新设置
    signal(2,fun); //重复设置闹钟 10 秒一次  然后发送信号使闹钟提前响起然后被重新设置
    alarm(10);
    while(true) 
    {
        cout<<getpid()<<"当前进程运行中..."<<endl; //18继续进程/19暂停进程 - 但进程被再次唤醒时变成了后台进程
        sleep(1);
    }

    return 0;
}